﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace DSA4_Heldenerstellung
{
    public class Rasse
    {

        public Dictionary<String,Int16> HaarfarbeDict { get; set; }

        public Dictionary<String, Int16> AugenfarbeDict { get; set; }

        public Dictionary<String, Int16> ModifikatorDict { get; set; }

        public Dictionary<String, Int16> TalenteDict { get; set; }

        public List<string> AutoVorteile { get; set; }

        public List<string> AutoNachteile { get; set; }

        public List<string> EmpfohleneVorteile { get; set; }

        public List<string> EmpfohleneNachteile { get; set; }

        public List<string> UngeeigneteVorteile { get; set; }

        public List<string> UngeeigneteNachteile { get; set; }

        public List<string> Kulturen { get; set; }

        public String PortraitPfad { get; set; }

        public String Info { get; set; }

        public String Besonderheiten { get; set; }

        public String Rassenname { get; set; }

        public String Grundpunkte { get; set; }

        private String Groessenformel;

        private int Gewichtabzug;

        public String Haarfarbe
        {
            get
            {
                int wahrsch = 0;
                int rndValue = 0;
                Random rnd = new Random();
                rndValue = rnd.Next(1, 100);
                foreach (string item in this.HaarfarbeDict.Keys)
                {
                    wahrsch = wahrsch + this.HaarfarbeDict[item];
                    if (rndValue <= wahrsch)
                    {
                        return item;
                    }
                }

                return "Fehler";
            }
        }

        public String Augenfarbe
        {
            get
            {
                int wahrsch = 0;
                int rndValue = 0;
                Random rnd = new Random();
                rndValue = rnd.Next(1, 100);
                foreach (string item in this.AugenfarbeDict.Keys)
                {
                    wahrsch = wahrsch + this.AugenfarbeDict[item];
                    if (rndValue <= wahrsch)
                    {
                        return item;
                    }
                }
                return "Fehler";
            }
        }

        public String Groesse
        {
            get
            {
                String[] daten = Groessenformel.Split(';');
                int rndValue = 0;
                Random rnd = new Random();

                rndValue = Convert.ToInt32(daten[0]);
                for (int i = 0; i < Convert.ToInt32(daten[1]); i++)
                {
                    rndValue += rnd.Next(1, 20);
                }
                for (int i = 0; i < Convert.ToInt32(daten[2]); i++)
                {
                    rndValue += rnd.Next(1, 6);
                }

                return rndValue.ToString();
            }
        }

        public String BerechneGewicht(String fGroesse)
        {
            return (Convert.ToInt16(fGroesse) - this.Gewichtabzug).ToString();
        }

        public bool Init(String fRasseName)
        {
            int rasseID = -1;
            DataSet daten = new DataSet();
            try
            {
                daten.ReadXml(@"daten\Rassen.xml");
            }
            catch (Exception)
            {
                throw;
            }
            

            foreach (DataRow item in daten.Tables["Rasse"].Rows)
            {
                if (item["Rasse_Name"].ToString() == fRasseName)
                {
                    rasseID = Convert.ToInt32(item["Rasse_Id"]);
                    this.InitRassedaten(item);
                    this.InitHaarfarben(daten, rasseID);
                    this.InitAugenfarben(daten, rasseID);
                    this.InitModifikatoren(daten, rasseID);
                    this.InitTalente(daten, rasseID);
                    this.InitAutoVorteile(item);
                    this.InitAutoNachteile(item);
                    this.InitEmpfohleneVorteile(item);
                    this.InitEmpfohleneNachteile(item);
                    this.InitUngeeigneteVorteile(item);
                    this.InitUngeeigneteNachteile(item);
                    this.InitKulturen(item);
                    return true;
                }
            }

            return false;
            
        }

        private void InitRassedaten(DataRow fRasse)
        {
            this.Rassenname = fRasse["Rasse_Name"].ToString();
            this.Grundpunkte = fRasse["Grundpunkte"].ToString();
            this.Groessenformel = fRasse["Groesse"].ToString();
            this.Gewichtabzug = Convert.ToInt32(fRasse["Gewicht"]);
            this.Info = fRasse["Info"].ToString();
            if (this.Info.Length > 2)
            {
                this.Info = this.Info.Remove(0, 2);
            this.Info = this.Info.Replace("        ", "");
            }
            this.Besonderheiten = fRasse["Besonderheiten"].ToString();
            if (this.Besonderheiten.Length > 2)
            {
                this.Besonderheiten = this.Besonderheiten.Remove(0, 2);
                this.Besonderheiten = this.Besonderheiten.Replace("        ", "");
            }
            this.PortraitPfad = fRasse["Portrait"].ToString();
        }

        private void InitHaarfarben(DataSet fDaten, int fRasseId)
        {
            this.HaarfarbeDict = new Dictionary<string, short>();

            foreach (DataRow item in fDaten.Tables["Haarfarbe"].Rows)
            {
                if (Convert.ToInt32(item["Rasse_Id"]) == fRasseId)
                {
                    this.HaarfarbeDict.Add(item["Farbe"].ToString(), Convert.ToInt16 (item["Wahrscheinlichkeit"]));
                }
            }
        }

        private void InitAugenfarben(DataSet fDaten, int fRasseId)
        {
            this.AugenfarbeDict = new Dictionary<string, short>();

            foreach (DataRow item in fDaten.Tables["Augenfarbe"].Rows)
            {
                if (Convert.ToInt32(item["Rasse_Id"]) == fRasseId)
                {
                    this.AugenfarbeDict.Add(item["Farbe"].ToString(), Convert.ToInt16(item["Wahrscheinlichkeit"]));
                }
            }
        }

        private void InitModifikatoren(DataSet fDaten, int fRasseId)
        {
            this.ModifikatorDict = new Dictionary<string, short>();

            foreach (DataRow item in fDaten.Tables["Eigenschafts-Mod"].Rows)
            {
                if (Convert.ToInt32(item["Rasse_Id"]) == fRasseId)
                {
                    this.ModifikatorDict.Add(item["Eigenschaft"].ToString(), Convert.ToInt16(item["Modifikator"]));
                }
            }
        }

        private void InitTalente(DataSet fDaten, int fRasseId)
        {
            this.TalenteDict = new Dictionary<string, short>();

            foreach (DataRow item in fDaten.Tables["Talent-Mod"].Rows)
            {
                if (Convert.ToInt32(item["Rasse_Id"]) == fRasseId)
                {
                    this.TalenteDict.Add(item["Talent"].ToString(), Convert.ToInt16(item["Modifikator"]));
                }
            }
        }

        private void InitAutoVorteile(DataRow fRasse)
        {
            String autoVorteile = fRasse["Automatische_Vorteile"].ToString();
            String[] vorteil = autoVorteile.Split(';');

            this.AutoVorteile = new List<string>();

            foreach (String item in vorteil)
            {
                this.AutoVorteile.Add(item);
            }
        }

        private void InitAutoNachteile(DataRow fRasse)
        {
            String autoNachteile = fRasse["Automatische_Nachteile"].ToString();
            String[] nachteil = autoNachteile.Split(';');

            this.AutoNachteile = new List<string>();

            foreach (String item in nachteil)
            {
                this.AutoNachteile.Add(item);
            }
        }

        private void InitEmpfohleneVorteile(DataRow fRasse)
        {
            String empfohleneVorteile = fRasse["Empfohlene_Vorteile"].ToString();
            String[] vorteil = empfohleneVorteile.Split(';');

            this.EmpfohleneVorteile = new List<string>();

            foreach (String item in vorteil)
            {
                this.EmpfohleneVorteile.Add(item);
            }
        }

        private void InitEmpfohleneNachteile(DataRow fRasse)
        {
            String empfohleneNachteile = fRasse["Empfohlene_Nachteile"].ToString();
            String[] nachteil = empfohleneNachteile.Split(';');

            this.EmpfohleneNachteile = new List<string>();

            foreach (String item in nachteil)
            {
                this.EmpfohleneNachteile.Add(item);
            }
        }

        private void InitUngeeigneteVorteile(DataRow fRasse)
        {
            String ungeeigneteVorteile = fRasse["Ungeeignete_Vorteile"].ToString();
            String[] vorteil = ungeeigneteVorteile.Split(';');

            this.UngeeigneteVorteile = new List<string>();

            foreach (String item in vorteil)
            {
                this.UngeeigneteVorteile.Add(item);
            }
        }

        private void InitUngeeigneteNachteile(DataRow fRasse)
        {
            String ungeeigneteNachteile = fRasse["Ungeeignete_Nachteile"].ToString();
            String[] nachteil = ungeeigneteNachteile.Split(';');

            this.UngeeigneteNachteile = new List<string>();

            foreach (String item in nachteil)
            {
                this.UngeeigneteNachteile.Add(item);
            }
        }

        private void InitKulturen(DataRow fRasse)
        {
            String eingeleseneKulturen = fRasse["Kulturen"].ToString();
            String[] kultur = eingeleseneKulturen.Split(';');

            this.Kulturen = new List<string>();

            foreach (String item in kultur)
            {
                this.Kulturen.Add(item);
            }
        }
      
    }
}
